package alarmdisplay;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.NoSuchElementException;
import java.util.StringTokenizer;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.UIManager;

public class GuiBase extends JFrame implements ActionListener  {
	public int MAX_BUTTON = 9;
	public JButton jb[] = new JButton[MAX_BUTTON];
	public JLabel jl1 = new JLabel("-");
	public JLabel jl2 = new JLabel("");
	public JLabel jl3 = new JLabel("");
	public JLabel jl4 = new JLabel("");
	public JLabel jl5 = new JLabel("");
	public JLabel jl6 = new JLabel("");
	public JFrame frame;
	public JTextPane jpa = new JTextPane();
	
	public JPanel panel_top;
	public JPanel panel_left;
	
	public static int iDelay = 11;
	public static String strLangEinsatz = "";
	public static String strURL1 = "";
	
	public static int iPort = 1;
	
	public JLabel jlIcon = new JLabel();
	public ImageIcon imageIcon = new ImageIcon();
	
	public javax.swing.Timer t = new javax.swing.Timer(iDelay, this);
	
	public GuiBase() {
		super();
		Debug.debug("GuiBase", "DEBUG>> Version: V1.20");
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception err) {
			Debug.debug("ANZEIGE",  "ERROR: " + err);
		}
	}

	/**
	 * 
	 */
	private static final long serialVersionUID = -8984932068374307167L;

	
	public void listen() {
		try {
			ServerSocket listen = new ServerSocket(iPort);
			while (true) {
				getConnection(listen.accept());
			}
		} catch (IOException err) {
			Debug.debug("ANZEIGE",  "ERROR>> [TCPServer]: " + err.toString());
		}
	}
	
	/****
	 * Bewegt die Maus an die Postition 0,2000 (links unten) des Bildschirms, um
	 * den Bildschirmschoner anzuhalten
	 */
	private void moveMouse() {
		Robot robot;
		try {
			robot = new Robot();
			robot.mouseMove(0, 2000);
                        robot.keyPress(27);
		} catch (AWTException e) {
			e.printStackTrace();
		}
	}
	
	
	public void getConnection(Socket s) {
		BufferedReader in = null;
		String str = "", strGesamt = "", strMapService = "";
		String sFixText ="", sRestText="", sEinsatzNr="", sDatum="", sStichwort="", sStichwortErgaenzung="", sObjekt="", sStrasse="", sStrasseOrt="";
                String sPLZOrt= "", sPLZ = "", sOrt = "", sZusatz1 = "", sZusatz2="", sPLZStadt="";
		try {
			in = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8"));
			InetAddress ia = s.getInetAddress();
			while ((str = in.readLine()) != null) {
				strGesamt = strGesamt + str;		
			}
                        if (!strGesamt.startsWith("TESTMESSAGE"))  {
                            Debug.debug("ANZEIGE", "DEBUG>> IP-Adresse: " + ia.getHostAddress());
                            Debug.debug("ANZEIGE", "DEBUG>>  Host-Name: " + ia.getHostName());
                        }
		} catch (IOException err) {
			Debug.debug("ANZEIGE", "ERROR>> [TCPServer]: " + err.toString());
		} finally {
			try {
				in.close();
			} catch (IOException err) {
				Debug.debug("ANZEIGE", "ERROR>> in.close(): " + err);
			}
			try {
				s.close();
			} catch (IOException err) {
				Debug.debug("ANZEIGE", "ERROR>> s.close(): " + err);
			}
		}
		if (strGesamt.startsWith("TESTMESSAGE")) {
			return;
		}
		Debug.debug("ANZEIGE", "DEBUG>> String: " + strGesamt);

		
		sFixText = strGesamt.substring(0, strGesamt.indexOf(":"));
		sRestText = strGesamt.substring(strGesamt.indexOf(":") + 1);

		Debug.debug("ANZEIGE", "DEBUG>> sFixText: " + sFixText);
		Debug.debug("ANZEIGE", "DEBUG>> sRestText: " + sRestText);
		//TODO
		moveMouse();
		
		while (sRestText.indexOf("**") != -1) {
			sRestText = sRestText.substring(0, sRestText.indexOf("**") + 1) + " *" + sRestText.substring(sRestText.indexOf("**") + 2, sRestText.length());
			Debug.debug("ANZEIGE", "DEBUG>> sRestText: " + sRestText);
		}

		try {
			StringTokenizer strTok1 = new StringTokenizer(sRestText, "*");
 			sEinsatzNr = strTok1.nextToken().trim(); // Einsatznummer
			sDatum = strTok1.nextToken().trim(); // Datum
			sStichwort = strTok1.nextToken().trim(); // Stichwort
			sStichwortErgaenzung = strTok1.nextToken().trim(); // Stichwort Ergänzung
			sObjekt = strTok1.nextToken().trim(); // Objekt
			sStrasse = strTok1.nextToken().trim(); // Strasse
			sStrasseOrt = strTok1.nextToken().trim(); // Strasse/Ort (Nicht geklaert)
			sPLZOrt = strTok1.nextToken().trim(); // PLZ & Ort oder Sonderlocken (BAB etc.)
			sZusatz1 = strTok1.nextToken().trim(); // Zusatz1
			sZusatz2 = strTok1.nextToken().trim(); // Zusatz2

			StringTokenizer strTok2 = new StringTokenizer(sPLZOrt, " ");
			sPLZ = strTok2.nextToken().trim(); // PLZ
			sOrt = strTok2.nextToken().trim(); // Zusatz (Pat. Name)
		} catch (NoSuchElementException err) {
			Debug.debug("ANZEIGE", "ERROR>> NoSuchElement (Falsche Formatierung der Nachricht?) " + err);
			sFixText = "<Falsche Nachricht> - " + sFixText;
		}
		
		Debug.debug("ANZEIGE", "DEBUG>> sEinsatzNr: " + sEinsatzNr); //alt Datum Uhrzeit
		Debug.debug("ANZEIGE", "DEBUG>> sDatum: " + sDatum); //alt Stichwort
		Debug.debug("ANZEIGE", "DEBUG>> sStichwort: " + sStichwort); //alt Stichwort Ergaenzung
		Debug.debug("ANZEIGE", "DEBUG>> sStichwortErgaenzung: " + sStichwortErgaenzung); //alt Objekt
		Debug.debug("ANZEIGE", "DEBUG>> sObjekt: " + sObjekt); //alt Strasse
		Debug.debug("ANZEIGE", "DEBUG>> sStrasse: " + sStrasse); //alt Strasse2
		Debug.debug("ANZEIGE", "DEBUG>> sStrasseOrt: " + sStrasseOrt); //alt PLZ Ort
		Debug.debug("ANZEIGE", "DEBUG>> sPLZOrt: " + sPLZOrt); //alt PLZ Ort
		Debug.debug("ANZEIGE", "DEBUG>> sPLZ: " + sPLZ); //alt Zusatz
		Debug.debug("ANZEIGE", "DEBUG>> sOrt: " + sOrt); //alt Pat. Name
		Debug.debug("ANZEIGE", "DEBUG>> sZusatz1: " + sZusatz1); //alt Zusatz
		Debug.debug("ANZEIGE", "DEBUG>> sZusatz2: " + sZusatz2); //alt Pat. Name

		Datenbank db = new Datenbank();
		strLangEinsatz = db.dbQueryFahrzeuge(sStichwort, sPLZOrt, jb);		// JButton setzen und Langtext des Einsatzes
		sPLZStadt = db.dbQueryOrt(sStichwort, sPLZOrt);
                Debug.debug("ANZEIGE", "DEBUG>> sPLZStadt: " + sPLZStadt);
		String sLat_Lon = db.slon_lat;
		String sxLat = "", sxLon = "", sX1="", sX2="", sX1a="", sX2a="";;
		// Ansicht mit fiktivem Ort Lat/Lon)
		if (!sLat_Lon.equals("")) {
			StringTokenizer sLat_Lon2 = new StringTokenizer(sLat_Lon, ",");
			sxLat = sLat_Lon2.nextToken();
			sxLon = sLat_Lon2.nextToken();
		} else {
                    StringTokenizer st5 = new StringTokenizer(sPLZStadt, " ");
                    sX1 = st5.nextToken();
                    sX2 = st5.nextToken();
                }
		jpa.setContentType("text/html");
		Debug.debug("ANZEIGE", "DEBUG>> Laenge sStrasse, sPLZ, sOrt " + (sStrasse + sX1a + sX2a).length());
		if (sObjekt.length()>0) {
			if ((sStrasse + sX1 + sX2).length()<60) {
				jpa.setText("<p style='font-size:50pt; font-family:Arial,Helvetica,sans-serif; font-weight:900;'>" + sFixText + " - " + sDatum + "<br>" + 
					     sStichwort + " - " + strLangEinsatz + "<br>" + 
					     sObjekt + "<br>" +
					     berechneMitte(sStichwortErgaenzung, sZusatz1, sZusatz2) + "<br>" +
					     sStrasse + ", " + sPLZOrt);
			} else {
				jpa.setText("<p style='font-size:50pt; font-family:Arial,Helvetica,sans-serif; font-weight:900;'>" + sFixText + " - " + sDatum + "<br>" + 
					     sStichwort + " - " + strLangEinsatz + "<br>" + 
					     sObjekt + "<br>" +
					     berechneMitte(sStichwortErgaenzung, sZusatz1, sZusatz2) + "<br>" +
					     "<p style='font-size:40pt; font-family:Arial,Helvetica,sans-serif; font-weight:900;'>" + 
                                             sStrasse + ", " + sPLZOrt);
			}
		} else {
				jpa.setText("<p style='font-size:50pt; font-family:Arial,Helvetica,sans-serif; font-weight:900;'>" + sFixText + " - " + sDatum + "<br>" + 
					     sStichwort + " - " + strLangEinsatz + "<br>" +
					     berechneMitte(sStichwortErgaenzung, sZusatz1, sZusatz2) + "<br>" +
					     sStrasse + ", " + sPLZOrt);
		}
	
		//
		// Karte erstellen
		//
		strMapService = db.dbQueryConfig("map_service");
		Debug.debug("ANZEIGE", "DEBUG>> Starte Kartendienst... ");
		strURL1 = Kartendienst.kartenDienst(sStrasse, sX1, sX2, strMapService, jlIcon, this, sxLat, sxLon);
		this.paint(this.getGraphics());

		// Timer (re)starten
		//
		if (t.isRunning()==true) {
			t.restart();
		} else {
			t.start();				// Timer starten
		}
	}


	/**
	 * Hier berechnen wir den haesslichen String! 
	 */
	public String berechneMitte(String s1, String s2, String s3) {
		String s = "", ss1="", ss2="";
		if (s1.isEmpty()) {
			ss1 = "";
		} else {
			ss1 = ", ";
		}
		if (s2.isEmpty()) {
			ss2 = "";
		} else {
			ss2 = ", ";
		}
		s = s1 + ss1 + s2 + ss2 + s3;
		return s.replaceAll(", $", "");
	}

	public void paint(Graphics g) {
		super.paint(g);
	}
	
	private void resetAnzeige() {
		for (int x=0; x < MAX_BUTTON; x++) {
			jb[x].setText("");
			jb[x].setBackground(Color.LIGHT_GRAY);
		}
		jl1.setText("-");
		jl2.setText("-");
		jl3.setText("-");
		jl4.setText("-");
		jl5.setText("-");
		jpa.setText("");
		imageIcon = new ImageIcon();
		jlIcon.setIcon(imageIcon);
		this.paint(this.getGraphics());
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof JButton) {
			Debug.debug("ANZEIGE", "DEBUG>> Button-Event, PDF erzeugen");
/*
                        try {
				Image i1 = new ImageIcon(new URL(strURL1)).getImage();
				PDFSchreiben ps = new PDFSchreiben();
				ps.initData(jl1.getText(), jl2.getText(), jl3.getText(), jl4.getText(), "", i1,
						jb[0].getText(), jb[1].getText(), jb[2].getText(), jb[3].getText(), jb[4].getText(),
						jb[5].getText(), jb[6].getText(), jb[7].getText(), jb[8].getText(), Kartendienst.getFormatierterWeg());
				ps.createPdf("dada.pdf");
			} catch (Exception err) {
				Debug.debug("ANZEIGE", "ERROR>> " + err);
			}
*/		
		}
		if (e.getSource() instanceof javax.swing.Timer) {
			Debug.debug("ANZEIGE", "DEBUG>> Timer-Event, Anzeige leeren");
			t.stop();
			resetAnzeige();
		}
	}

}